package org.example.controller;

import com.google.common.collect.ImmutableMap;
import org.example.entity.SysMenu;
import org.example.service.AddMenuService;
import org.example.service.DeleteMenuByIdService;
import org.example.service.EditMenuService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Map;

@RestController
@RequestMapping("/usermenu")
public class UserMenuController {

    @Resource
    private AddMenuService addMenuService;

    @Resource
    private DeleteMenuByIdService deleteMenuByIdService;

    @Resource
    private EditMenuService editMenuService;
    /**
     * 1.sys:user:add与数据库中 sys_menu表中的perms 字段值是对应的；并不一定说使用 ":", 只需要保证
     数据库中的自段子与 hasAnyAuthority('sys:user:add') 中的字符串一致即可。
     * 2.每次执行对应的方法之前，需要去看 UsernamePasswordAuthenticationToken 中是否拥有该权限，如果有
     *  那么就可以执行该方法。
     */
//    @PreAuthorize("hasAuthority('sys:user:add')")
    @PostMapping
    public Integer addMenu(@RequestBody SysMenu sysMenu){
        boolean b = addMenuService.addMenu(sysMenu);

        if(b){
            return 1;
        }else {
            return 0;
        }

    }

    /**
     * hasAnyAuthority('sys:user:delete, sys:user:edit') 表示用户拥有 sys:user:delete或者
     * sys:user:edit 这个两项权限中一个，都可以操作该方法
     */
//    @PreAuthorize("hasAnyAuthority('sys:user:delete, sys:user:edit')")
    @DeleteMapping("/{id}")
    public Map<String,Object> deleteMenuById(@PathVariable("id") Integer id){
        deleteMenuByIdService.deleteMenuById(id);
        return ImmutableMap.of("code", 1, "msg", "success");
    }

//    @PreAuthorize("hasAuthority('sys:user:view')")
    @GetMapping("/{id}")
    public SysMenu getMenuById(@PathVariable("id") Integer id){
       return editMenuService.getMenuById(id);
    }

    // @PreAuthorize("hasAnyAuthority('sys:user:edit')")
//    @PreAuthorize("hasAuthority('sys:user:edit') and hasAuthority('sys:user:view')")
    @PutMapping
    public Map<String, Object> edit(@RequestBody SysMenu sysMenu) {
        editMenuService.editMenu(sysMenu);
        return ImmutableMap.of("code", 1, "msg", "success");
    }
}
